package main
import (
	"fmt" 
	"os" 
	"io" 
	"bufio"
)

type CharCount struct{
	ChCount int // 记录英文个数
	NumCount int // 记录数字的个数
	SpaceCount int //记录空格的个数
	OtherCount int // 记录其他字符的个数
}

//统计一个文件中含有的英文、数字、空格及其它字符数量

func main(){

	// 思路 ： 打开一个文件，创一个Reader
	//每读取一行，就去统计该行有多少个 英文、数字、空格和其他字符
	 //然后将结果保存到一个结构体
	 filePath :="E:\\ProgramData\\GoWorkSpace\\src\\go_code\\project03/day1/abd.txt"
	 file,err := os.OpenFile(filePath,os.O_RDONLY|os.O_CREATE,0666)
	if err !=nil{
		fmt.Println("open file err = ",err)
		return
	}

	defer file.Close()

	var count CharCount

	reader := bufio.NewReader(file)
	for {
		str, err := reader.ReadString('\n')
		if err == io.EOF { //读到文件末尾就退出 
			break 
		}
		//为了兼容中文字符, 可以将 str 转成 []rune 
		str1 := []rune(str)
		 //遍历 str ，进行统计
		 for _, v := range str1 { 
			 switch {
					case v >= 'a' && v <= 'z':
					fallthrough //穿透
					case v >= 'A' && v <= 'Z': 
						count.ChCount++
					case v == ' ' || v == '\t':
						count.SpaceCount++ 
					case v >= '0' && v <= '9': 
						count.NumCount++
					default : 
						count.OtherCount++ 
					}
			}
	}
	fmt.Printf("字符的个数为=%v 数字的个数为=%v 空格的个数为=%v 其它字符个数=%v", 
	count.ChCount, count.NumCount, count.SpaceCount, count.OtherCount)

}